<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 输出结果为4
        // 每一次for循环的时候，settimeout都执行一次，
        // 但是里面的函数没有被执行，而是被放到了任务队列里面，
        // 等待执行，for循环了4次，就放了4次，
        // 当主线程执行完成后，才进入任务队列里面执行。
        for(var i=0;i<=3;i++){
            setTimeout(function(){
                console.log(i);
            },0)
        }

        // 当我把var 变成let 时，结果为0,1,2,3
        // 因为for循环头部的let不仅将i绑定到for循环快中
        // setTimeout里面的function()属于一个新的域，
        // 通过 var 定义的变量是无法传入到这个函数执行域中的，
        // 通过使用 let 来声明块变量，这时候变量就能作用于这个块，所以 function就能使用 i 这个变量了；这个匿名函数的参数作用域 和 for参数的作用域 不一样，是利用了这一点来完成的。
        // 这个匿名函数的作用域有点类似类的属性，是可以被内层方法使用的。
        for(let i=0;i<=3;i++){
            setTimeout(function(){
                console.log(i);
            },0)
        }
    </script>
</body>
</html>